package Java_keshe;

public class BianBieLei {
    public static double bianbie(String biaodashi){
        double result=0;  //计算结果
        int n=biaodashi.length();  //获得字符串的长度
        double[] num = new double[2];//表示表达式中，运算符两边的两个数的值
        char jjcc='\0';   //表示是加减乘除中的哪个运算
        int index=0;   //表示运算符所在的位置

        double zf=1;   //表示数的前面有没有符号，值有1和-1，最后乘上去
        int i=0;   //用于遍历
        int k=0;    //表示字符串的下标
        int cifang=0;  //表示有没有计算次方这个函数，没有就是0，有就是1
        int indexcifang=0;   //表示^的位置
        int a=0,b=0;  //a表示在函数中数字的开头位置，b表示在函数中数字的结尾位置的后一位


        //寻找运算符所在的位置
        int kaishi=1;    //表示寻找运算符的初始位置。从位置1开始，因为位置0不可能是运算符
        if(biaodashi.charAt(0)=='|'){   //如果第一个字符是表示绝对值的'|'，那么位置1不可能是运算符
            kaishi=2;
        }

        for(i=kaishi;i<n;i++){
            if(biaodashi.charAt(i)=='+'||biaodashi.charAt(i)=='-'||biaodashi.charAt(i)=='×'||biaodashi.charAt(i)=='÷'){
                index=i;    //获得了运算符所在的位置
                if(biaodashi.charAt(i)=='+')
                    jjcc='+';
                if(biaodashi.charAt(i)=='-')
                    jjcc='-';
                if(biaodashi.charAt(i)=='×')
                    jjcc='×';
                if(biaodashi.charAt(i)=='÷')
                    jjcc='÷';
                break;
            }
        }







        //计算运算符左边的那个数

        if(biaodashi.charAt(0)=='-') {    //判断前面有无负号
            zf = -1;
            k=1;        //以后从下标1开始计算
        }

        for(i=k;i<index;i++){     //判断有没有计算次方的函数
            if(biaodashi.charAt(i)=='^'){
                cifang=1;
                indexcifang=i;
            }
        }

        if(cifang==1){   //左边的函数是计算次方
            num[0]=Math.pow(Double.parseDouble(biaodashi.substring(k,indexcifang)),Double.parseDouble(biaodashi.substring(indexcifang+1,index)));
        }else{     //左边没有计算次方的函数
            for(i=k;i<index;i++){   //寻找数字的开头位置
                if((biaodashi.charAt(i)>='0'&&biaodashi.charAt(i)<='9')||biaodashi.charAt(i)=='-'){
                    a=i;
                    break;
                }
            }

            for(i=a+1;i<=index;i++){   //寻找数字的结尾位置的后一位
                if((biaodashi.charAt(i)<'0'||biaodashi.charAt(i)>'9')&&biaodashi.charAt(i)!='.'){
                    b=i;
                    break;
                }
            }
            num[0]=Double.parseDouble(biaodashi.substring(a,b));  //求出函数里的自变量的值（在没有函数的情况下，这就是加正负号之前的值）
            //若左边有其他函数，则开始计算
            if(biaodashi.charAt(k)=='|'){    //绝对值||
                num[0]=Math.abs(num[0]);
            }else if(biaodashi.charAt(k)=='x'){
                if(biaodashi.charAt(k+1)=='s'){   //向上取整xsqz
                    num[0]=Math.ceil(num[0]);
                }else{                            //向下取整xxqz
                    num[0]=Math.floor(num[0]);
                }
            }else if(biaodashi.charAt(k)=='s'){
                if(biaodashi.charAt(k+1)=='i'){   //正弦函数sin
                    num[0]=Math.sin(num[0]);
                }else{                             //平方根sqrt
                    num[0]=Math.sqrt(num[0]);
                }
            }else if(biaodashi.charAt(k)=='c'){
                if(biaodashi.charAt(k+1)=='o'){    //余弦函数cos
                    num[0]=Math.cos(num[0]);
                }else{                             //立方根cbrt
                    num[0]=Math.cbrt(num[0]);
                }
            }else if(biaodashi.charAt(k)=='t'){   //正切函数tan
                num[0]=Math.tan(num[0]);
            }else if(biaodashi.charAt(k)=='d'){   //倒数daoshu
                num[0]=1.0/num[0];
            }
        }
        //最后乘上符号（乘1或-1），运算符左边的值就出来了
        num[0]=num[0]*zf;








        zf=1;   //表示数的前面有没有符号，值有1和-1，最后乘上去
        i=0;   //用于遍历
        k=index+1;    //表示字符串的下标
        cifang=0;  //表示有没有计算次方这个函数，没有就是0，有就是1
        indexcifang=0;   //表示^的位置
        a=0;b=0;  //a表示在函数中数字的开头位置，b表示在函数中数字的结尾位置的后一位






        //计算运算符右边的那个数

       /*  if(biaodashi.charAt(index+1)=='-') {    //没必要
            zf = -1;
            k=index+2;        //以后从下标1开始计算
        }  */
        for(i=k;i<n;i++){     //判断有没有计算次方的函数
            if(biaodashi.charAt(i)=='^'){
                cifang=1;
                indexcifang=i;
            }
        }
        if(cifang==1){   //右边的函数是计算次方
            num[1]=Math.pow(Double.parseDouble(biaodashi.substring(k,indexcifang)),Double.parseDouble(biaodashi.substring(indexcifang+1)));
        }else{     //右边没有计算次方的函数
            for(i=k;i<n;i++){   //寻找数字的开头位置
                if((biaodashi.charAt(i)>='0'&&biaodashi.charAt(i)<='9')||biaodashi.charAt(i)=='-'){
                    a=i;
                    break;
                }
            }
            for(i=a+1;i<n;i++){   //寻找数字的结尾位置的后一位
                if((biaodashi.charAt(i)<'0'||biaodashi.charAt(i)>'9')&&biaodashi.charAt(i)!='.'){
                    b=i;
                    break;
                }
            }
            if(b==0){  //如果遍历完了还没有给b赋值，那就说明整个表达式的最后一位依旧是数字
                num[1]=Double.parseDouble(biaodashi.substring(a));  //求出运算符右边的值
            }else {     //有函数时
                num[1] = Double.parseDouble(biaodashi.substring(a, b));  //求出函数里的自变量的值
            }
            //若右边有其他函数，则开始计算
            if(biaodashi.charAt(k)=='|'){    //绝对值||
                num[1]=Math.abs(num[1]);
            }else if(biaodashi.charAt(k)=='x'){
                if(biaodashi.charAt(k+1)=='s'){   //向上取整xsqz
                    num[1]=Math.ceil(num[1]);
                }else{                            //向下取整xxqz
                    num[1]=Math.floor(num[1]);
                }
            }else if(biaodashi.charAt(k)=='s'){
                if(biaodashi.charAt(k+1)=='i'){   //正弦函数sin
                    num[1]=Math.sin(num[1]);
                }else{                             //平方根sqrt
                    num[1]=Math.sqrt(num[1]);
                }
            }else if(biaodashi.charAt(k)=='c'){
                if(biaodashi.charAt(k+1)=='o'){    //余弦函数cos
                    num[1]=Math.cos(num[1]);
                }else{                             //立方根cbrt
                    num[1]=Math.cbrt(num[1]);
                }
            }else if(biaodashi.charAt(k)=='t'){   //正切函数tan
                num[1]=Math.tan(num[1]);
            }else if(biaodashi.charAt(k)=='d'){   //倒数daoshu
                num[1]=1.0/num[1];
            }
        }
        //下面这行没必要
        /*   num[1]=num[1]*zf;  */





        //开始最终的计算，把运算符两边的两个值进行四则运算
        if(jjcc=='+'){
            result=num[0]+num[1];
        }else if(jjcc=='-'){
            result=num[0]-num[1];
        }else if(jjcc=='×'){
            result=num[0]*num[1];
        }else{
            result=num[0]/num[1];
        }




        return result;
    }
}
